headerbar: Disconnect signal handlers when children are removed
authorKjell Ahlstedt <kjellahlstedt@gmail.com>
Wed, 13 Nov 2019 14:20:34 +0000 (15:20 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 14 Nov 2019 08:15:58 +0000 (09:15 +0100)
The signal handler that calls notify_child_cb() is disconnected
from a child widget before the child is removed from the header bar.
gtk_header_bar_dispose() chains up before destroying the start and end
boxes, thus avoiding calls to notify_child_cb() after start_box and
end_box have been cleared.

Fixes #2246

gtk/gtkheaderbar.c

index 7141a2d300dc7f146cced0c895f2ae0cec18d2f4..582c945c4cc8bcc92cab4169e7a375b89ab93efb 100644 (file)
@@ -818,10 +818,11 @@ gtk_header_bar_dispose (GObject *object)
 
   g_clear_pointer (&priv->custom_title, gtk_widget_unparent);
   g_clear_pointer (&priv->label_box, gtk_widget_unparent);
-  g_clear_pointer (&priv->start_box, gtk_widget_unparent);
-  g_clear_pointer (&priv->end_box, gtk_widget_unparent);
 
   G_OBJECT_CLASS (gtk_header_bar_parent_class)->dispose (object);
+
+  g_clear_pointer (&priv->start_box, gtk_widget_unparent);
+  g_clear_pointer (&priv->end_box, gtk_widget_unparent);
 }
 
 static void
@@ -981,11 +982,13 @@ gtk_header_bar_remove (GtkContainer *container,
 
   if (parent == priv->start_box)
     {
+      g_signal_handlers_disconnect_by_func (widget, notify_child_cb, bar);
       gtk_container_remove (GTK_CONTAINER (priv->start_box), widget);
       removed = TRUE;
     }
   else if (parent == priv->end_box)
     {
+      g_signal_handlers_disconnect_by_func (widget, notify_child_cb, bar);
       gtk_container_remove (GTK_CONTAINER (priv->end_box), widget);
       removed = TRUE;
     }